package edu.groupservice.feign;

import edu.config.FeignConfig;
import edu.groupservice.feignFailBack.UserServiceFeignFailBack;
import edu.groupservice.feignFailBack.UserServiceFeignFallbackFactory;
import edu.groupservice.entity.User;
import feign.Param;
import feign.RequestLine;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Created by JPhoebe on 2017-7-9.
 */

/**
 * feign 可以再 configuration 中 配置 只针对该feignclient的 htstrix 支持
 *
 * fallback    只可以 回调
 * fallbackFactory   不仅可以回调，还可以捕获异常
 * fallback 和 fallbackFactory  只可以使用其中一个
 */

/**
 *  ?????????????????????????????待测试
 * 配置的fallback class也必须在FeignClient Configuration中实例化，否则会报
    java.lang.IllegalStateException: No fallback instance of type class异常。
    如果既要自定义 feign 又需要 fallback ， 可以将两个类中的方法卸载一个类中
 */
@FeignClient(
        value = "UserService",
//        configuration = FeignConfig.class,
//        fallback = UserServiceFeignFailBack.class
        fallbackFactory = UserServiceFeignFallbackFactory.class
)
public interface UserServiceFeign {

    /**
     *  三个注意点：
     *  feign 不支持 getmapping 组合注解
     *  只能使用requestMapping 或者 requeestLine 注解
     *
     *  使用 PathVariable 和 requestParam 注解时  必须写明 value ，否则报错
     *
     *  当参数为 对象 是，feign默认的是使用post方式，即便写的get方法
     *
     * */
    @RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
    User findUserById(@PathVariable(value = "id") long id);

//        @RequestLine("GET /user/{id}")
//        User findUserById(@Param(value = "id") long id);
}
